/* eslint-disable no-bitwise */
/* eslint no-underscore-dangle: off */

// import * as uuid from 'uuid'

// const win = window

// const colorTool = require('color')

// interface IProps {
//   path: string
// }

// // 当主题色配置项里没有主色时的替代色
// const errorColor = 'transparent'

// export function numberToHex(number) {
//   return number
// }

// // 判断某个点是否落在一个矩形内
// export function IsPointInMatrix(p1, p2, p3, p4, p) {
//   function GetCross(p1, p2, p) {
//     return (p2.x - p1.x) * (p.y - p1.y) - (p.x - p1.x) * (p2.y - p1.y)
//   }
//   let isPointIn = GetCross(p1, p2, p) * GetCross(p3, p4, p) >= 0 && GetCross(p2, p3, p) * GetCross(p4, p1, p) >= 0
//   return isPointIn
// }

// // 终端是window
// export function isWindow() {
//   const sUserAgent = navigator.userAgent
//   return (navigator.platform === 'Win32') || (navigator.platform === 'Windows')
// }

// // 根据主题颜色生成渐变背景
// export function getGradientBg(colors) {
//   const scale = d3.scaleLinear().range([0, colors.length - 1]).domain([0, 100])
//   const start = colors[Math.floor(scale(40))]
//   const end = colors.slice(-2)[0]

//   // 获取颜色的明度
//   const startLuminance = colorTool(start).hsv().color[2]
//   const endLuminance = colorTool(end).hsv().color[2]
//   const startOpacity = 0.83
//   const endOpacity = 0.87

//   return {
//     startColor: colorTool(start).darken(startOpacity).hex(),
//     endColor: colorTool(end).darken(endOpacity).hex(),
//   }
// }

// // 根据一组颜色生成一个颜色列表
// export function generateColorList(color, n = 255) {
//   const colors = []
//   for (let a = 0, b = 1; b < color.length; a += 1, b += 1) {
//     const compute = d3.interpolate(color[a], color[b])
//     for (let i = 0; i < n; i += 1) {
//       colors.push(compute(i / n))
//     }
//   }
//   colors.push(color.slice(-1))
//   return colors
// }

// // 是否为有效十六进制颜色
// export function isValidHex(value) {
//   let color = value
//   if (!color || typeof color !== 'string') return false

//   if (color.substring(0, 1) === '#') color = color.substring(1)

//   switch (color.length) {
//     case 3: return /^[0-9A-F]{3}$/i.test(color)
//     case 6: return /^[0-9A-F]{6}$/i.test(color)
//     case 8: return /^[0-9A-F]{8}$/i.test(color)
//     default: return false
//   }
// }

// // 根据颜色配置获取颜色列表
// export function getColorsList(colorsAmount, colorsShiftAmount, mixColor, rotate, saturation, mainColor) {
//   const colorsList = []
//   const givenColor = isValidHex(numberToHex(mainColor)) ? numberToHex(mainColor) : errorColor

//   let step
//   for (step = 0; step < colorsAmount; step += 1) {
//     if (isValidHex(numberToHex(mainColor))) {
//       colorsList.push(colorTool(givenColor)
//         .rotate((step + 1) / colorsAmount * -rotate)
//         .saturate((step + 1) / colorsAmount * (saturation / 100))
//         .mix(colorTool(mixColor), (colorsShiftAmount / 100) * (step + 1) / colorsAmount)
//         .hex())
//     } else {
//       colorsList.push(errorColor)
//     }
//   }

//   return mixColor === 'white' ? colorsList.reverse() : colorsList
// }

// // 根据主题色配置获取色带
// export function getRibbon(themeOption) {
//   const la = getColorsList(
//     themeOption.lightColorsAmount,
//     themeOption.lightestAmount,
//     'white',
//     themeOption.lightColorsMixRotate,
//     themeOption.lightSaturation,
//     themeOption.mainColor
//   )

//   const lb = getColorsList(
//     themeOption.darkColorsAmount,
//     themeOption.darkestAmount,
//     'black',
//     themeOption.darkColorsMixRotate,
//     themeOption.darkSaturation,
//     themeOption.mainColor
//   )

//   return [
//     ...la,
//     numberToHex(themeOption.mainColor),
//     ...lb,
//   ]
// }

// export function asyncComponent(getComponent) {
//   return class AsyncComponent extends React.Component<IProps, {}> {
//     static Component = null
//     state = {Component: AsyncComponent.Component}

//     componentWillMount() {
//       /* eslint react/destructuring-assignment: off */
//       if (!this.state.Component) {
//         getComponent().then(Component => {
//           AsyncComponent.Component = Component
//           this.setState({Component})
//         })
//       }
//     }

//     render() {
//       const {Component} = this.state
//       if (Component) {
//         return <Component {...this.props} />
//       }
//       return null
//     }
//   }
// }

// // 占位函数
// export function noop() {
//   /* no-empty: off */
// }

// export function getSpanWidth(data, size = 16) {
//   const tempSpanNode: any = d3.select('body')
//     .append('span')
//     .text(data)
//     .style('font-size', `${size}px`)
//     .attr('id', 'tempSpan')
//     .node()

//   const textWidth = document.getElementById('tempSpan').offsetWidth
//   tempSpanNode.remove()

//   return textWidth
// }

// export function fontSize(artboardHeight: number, n: number) {
//   // return this.artboardHeight*n/1050
//   return (artboardHeight / 105) * (n / 10)
// }


// /**
//  * url 解析
//  * @param url 
//  */
// export function urlParse(url) {
//   const qs = {}
//   if (url.indexOf('?') !== -1) {
//     const str = url.split('?')[1]
//     const strs = str.split('&')
//     for (let i = 0; i < strs.length; i++) {
//       qs[strs[i].split('=')[0]] = unescape(strs[i].split('=')[1])
//     }
//   }
//   return qs
// }
// // 剔除 undefined
// export function getRealValue(value: any, defaultValue: any) {
//   return typeof value === 'undefined' ? defaultValue : value
// }

// /**
//  * 将字符串中所有小写字母转大写
//  * @param str
//  */
// export function toUpperCase(str: string) {
//   return str.replace(/[a-z]/g, v => {
//     return v.toUpperCase()
//   })
// }

/**
 * 保留小数点后 n 位，整数取整
 * @param number 
 * @param digit 
 */
export function toFixed(number, digit = 2) {
  if (typeof number !== 'number') {
    return 0
  }

  let rs = number.toFixed(digit)
  let tail = ''
  for (let i = 0; i < digit; i++) {
    tail += '0'
  }
  if (`${rs}`.indexOf('.') > -1 && rs.endsWith(`.${tail}`)) {
    rs = `${rs}`.replace(`.${tail}`, '')
  }

  return rs - 0
}

/**
 * 是个有效值
 * @param v 
 */
export function isDef(v) {
  return v !== undefined && v !== null
}

// // 是个字符串
// export function isString(v) {
//   return Object.prototype.toString.call(v) === '[object String]'
// }

// // 是个对象
// export function isObject(v) {
//   return Object.prototype.toString.call(v) === '[object Object]'
// }

// // 是个数组
// export function isArray(v) {
//   return Object.prototype.toString.call(v) === '[object Array]'
// }

// /**
//  * 生成 uuid ，去掉横线那种
//  * @param prefix 
//  */
// export function getUUID(prefix: string = '') {
//   return `${prefix}${uuid().replace(/-/g, '')}`
// }


/**
 * 
 * 火狐浏览器
 */
// export const isFirefox = () => navigator.userAgent.indexOf('Firefox') >= 0


/**
 * 
 * 是否是 Mac 系统
 */
// export const isMac = () => /macintosh|mac os x/i.test(navigator.userAgent)


/**
 * 
 * 前端路由统一的添加一个前缀
 */
// export const addPathPrefix = (path) => {
//   const {pathPrefix = ''} = win.__onerConfig
//   return pathPrefix + path
// }

/**
 * 
 * 获取需要添加的前缀
 */
// export const getPathPrefix = () => {
//   const {pathPrefix = ''} = win.__onerConfig
//   return pathPrefix
// }

/**
 * base64 加解密
 */
export const decode = input => new Buffer(input, 'base64').toString()
export const encode = input => new Buffer(input).toString('base64')

// 随机字符串字符集
const chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'

// 创建随机字符串
export function random(n = 6) {
  let string = ''
  for (let i = 0; i < n; i++) {
    string += chars.charAt(Math.floor(Math.random() * chars.length))
  }
  return string
}

// 中文转 code 字符串 eg： "中文" => "2001325991"
// export function zh2code(zhStr = '') {
//   if (!zhStr) {
//     return ''
//   }
//   return zhStr.split('').map(s => s.charCodeAt(0)).join('')
// }

export function uuid() {
  const s = []
  const hexDigits = '0123456789abcdef'
  for (let i = 0; i < 36; i++) {
    s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)
  }
  s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010
  s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01
  // s[8] = s[13] = s[18] = s[23] = '-'

  const str = s.join('')
  return str
}

export function parseUrl(url) {
  const urlObj = {
    protocol: /^(.+)\:\/\//,
    host: /\:\/\/(.+?)[\?\#\s\/]/,
    path: /\w(\/.*?)[\?\#\s]/,
    query: /\?(.+?)[\#\/\s]/,
    hash: /\#(\w+)\s$/,
  }
  url += ' '
  function formatQuery(str) {
    return str.split('&').reduce((a, b) => {
      const arr = b.split('=')
      a[arr[0]] = arr[1]
      return a
    }, {})
  }
  for (const key in urlObj) {
    const pattern = urlObj[key]
    urlObj[key] = key === 'query' ? (pattern.exec(url) && formatQuery(pattern.exec(url)[1])) : (pattern.exec(url) && pattern.exec(url)[1])
  }
  return urlObj
}
